package main

import "fmt"

func ss1() {
	// 声明一个类似于切片，切片的类型是函数
	var functionList []func()

	for i := 0; i < 5; i++ {
		// 函数的闭包，最后的(i) 代表， 定义完函数后，立即执行函数，并将i作为参数传递进去
		// 这时 arg == i , 返回的匿名函数找不到arg参数，它会向上找到抵押给函数中的arg参数
		// 这样就形成了闭包
		function := func(arg int) func() {
			return func() {
				fmt.Println(arg)
			}
		}(i)
		// 返回的函数 加入到切片中
		functionList = append(functionList, function)
	}

	fmt.Println(functionList)
	functionList[0]()
	functionList[1]()
	functionList[2]()
}

// 问题 为什么这样定义的函数返回值跟闭包的函数返回值相同
func ss2() {
	var functionList []func()

	for i := 0; i < 5; i++ {
		function := func() {
			fmt.Println(i)
		}
		functionList = append(functionList, function)
	}

	fmt.Println(functionList)
	functionList[0]()
	functionList[1]()
	functionList[2]()
}
